/**
 * 
 */
package com.cqan.service;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import com.cqan.orm.Page;
import com.cqan.orm.PropertyFilter;
import com.cqan.orm.PropertyFilter.MatchType;

/**
 * @author slaton
 *
 * 下午05:15:10
 */
public interface EntityService<T,PK extends Serializable> {

	/**
	 * 
	 * 根据ID 获取实体对象
	 * 
	 * @param id
	 * @return
	 */
	public T get(PK id);

	/**
	 * 
	 * 根据主键删除实体对象
	 * 
	 * @param id
	 */
	public void delete(PK id);

	/**
	 * 
	 * 更新实体对象
	 * 
	 * @param t
	 * @return
	 */
	public void update(T t);

	/**
	 * 
	 * 添加实体对象
	 * 
	 * @param t
	 * @return
	 */
	public void add(T t);

	/**
	 * 
	 * 分页获取实体对象
	 * 
	 * @param page
	 * @return
	 */
	public Page<T> getAll(Page<T> page);
	
	/**
	 * 获取所有实体对象
	 */
	public List<T> getAll();

	/**
	 * 
	 * 根据条件分页筛选
	 * 
	 * @param propertyFilters
	 * @return
	 */
	public Page<T> search(Page<T> page, List<PropertyFilter> filters);

	/**
	 * 
	 * 根据条件筛选
	 * @param filters
	 * @return
	 */
	public List<T> getList(List<PropertyFilter> filters);
	
	public List<T> getList(String hql,Map<String,Object> values);
	
	
	public List<T> getList(String hql);
	
	/**
	 * 根据主键批量删除
	 * @param ids
	 */
	public void delete(List<PK> ids);
	
	/**
	 * 按属性查找对象列表,支持多种匹配方式.
	 * 
	 * @param matchType 匹配方式,目前支持的取值见PropertyFilter的MatcheType enum.
	 */
	public List<T> findBy(final String propertyName, final Object value, final MatchType matchType);
	
	/**
	 * 根据属性名查询指定对象
	 * @param propertyName
	 * @return
	 */
	public T findBy(String propertyName ,Object value);
}
